package com.quasar.hpatient.widget;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.quasar.hpatient.R;
import com.quasar.hpatient.model.custommodel.TemperatureTableItem;
import com.vise.log.ViseLog;

import java.util.ArrayList;
import java.util.List;
import lecho.lib.hellocharts.formatter.SimpleLineChartValueFormatter;
import lecho.lib.hellocharts.gesture.ZoomType;
import lecho.lib.hellocharts.model.Axis;
import lecho.lib.hellocharts.model.AxisValue;
import lecho.lib.hellocharts.model.Line;
import lecho.lib.hellocharts.model.LineChartData;
import lecho.lib.hellocharts.model.PointValue;
import lecho.lib.hellocharts.model.ValueShape;
import lecho.lib.hellocharts.model.Viewport;
import lecho.lib.hellocharts.view.LineChartView;

/**
 * author : 许建宏
 * Date: 2017/11/23 0023
 * View:
 */

public class lineChartView<T> extends LinearLayout {

    //折线图数据
    private List<PointValue> mPointValues = new ArrayList<PointValue>();
    private List<PointValue> mPointValues1 = new ArrayList<PointValue>();
    private List<PointValue> mPointValues2 = new ArrayList<PointValue>();
    //第三条折线
    private List<PointValue> mPointValues3 = new ArrayList<PointValue>();
    private List<AxisValue> mAxisXValues = new ArrayList<AxisValue>();
    //第三条折线
    private List<AxisValue> mAxisXValues1 = new ArrayList<AxisValue>();

    List<String> aString = new ArrayList<>();
    List<Float> yFloat = new ArrayList<>();
    //第三条折线
    List<String> aString1 = new ArrayList<>();
    List<Float> yFloat1 = new ArrayList<>();

    String[] date = {"1"};// X轴的标注
    int[] score = {74};// 图表的数据.
    Float MAXValue, MIXValue;
    int Status;


    TextView iv_min;//最小值标识
    TextView iv_max;//最大值标识
    FrameLayout fl_visibili;
    //参考值
    public String referenceValue;
    /**
     * 0 代表无参考值
     * 1 代表只有最小值
     * 2 代表只有最大值
     * 3 代表有最大最小值
     */

    int Maxstatus = 2;
    int Mixstatus = 1;
    int Nostatus = 0;
    int Allstatus = 3;

    public String ic_accuracy;
    String lc_min_title,lc_max_title,lc_name_x,lc_name_y;
    Drawable lc_min_ic,lc_max_ic,ic_line_min_ic,ic_line_max_ic,ic_line_normal_ic;

    ImageView tv_image2,tv_image1;

    LineChartView line_chart;//折线图
    LinearLayout ll_visibili;

    public lineChartView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context,attrs);
    }

    public lineChartView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context,attrs);
    }

    public void init(Context context, AttributeSet attrs){
        //获取自定义属性
        final TypedArray typedArray = getContext().obtainStyledAttributes(
                attrs, R.styleable.lineChartWidget);
        initView(context);

        lc_min_title=typedArray.getString(R.styleable.lineChartWidget_lc_min_title);//最小值标题
        lc_max_title=typedArray.getString(R.styleable.lineChartWidget_lc_max_title);//最大值标识
        lc_min_ic=typedArray.getDrawable(R.styleable.lineChartWidget_lc_min_ic);//最小值图片
        lc_max_ic=typedArray.getDrawable(R.styleable.lineChartWidget_lc_max_ic);//最大值图片
        ic_line_min_ic=typedArray.getDrawable(R.styleable.lineChartWidget_ic_line_min_ic);//折线最小值颜色
        ic_line_max_ic=typedArray.getDrawable(R.styleable.lineChartWidget_ic_line_max_ic);//折线最大值颜色
        ic_line_normal_ic=typedArray.getDrawable(R.styleable.lineChartWidget_ic_line_normal_ic);//检测值折线颜色
        referenceValue=typedArray.getString(R.styleable.lineChartWidget_ic_reference_value);//参考值
        lc_name_x=typedArray.getString(R.styleable.lineChartWidget_lc_name_x);//x轴单位
        lc_name_y=typedArray.getString(R.styleable.lineChartWidget_lc_name_y);//y轴单位
        ic_accuracy=typedArray.getString(R.styleable.lineChartWidget_ic_accuracy);//精度

        //赋值
        if(lc_min_title!=null){
            iv_min.setText(lc_min_title);
        }

        if(lc_max_title!=null){
            iv_max.setText(lc_max_title);
        }

        if(lc_min_ic!=null){
            tv_image1.setImageDrawable(lc_min_ic);
        }

        if(lc_max_ic!=null){
            tv_image2.setImageDrawable(lc_max_ic);
        }
    }

    public void initView(Context context){
        LayoutInflater.from(context).inflate(R.layout.line_chart_layout, this);
        iv_min= (TextView) findViewById(R.id.iv_min);
        iv_max= (TextView) findViewById(R.id.iv_max);
        line_chart= (LineChartView) findViewById(R.id.line_chart);
        fl_visibili= (FrameLayout) findViewById(R.id.fl_visibili);
        ll_visibili= (LinearLayout) findViewById(R.id.ll_visibili);
        tv_image1= (ImageView) findViewById(R.id.tv_image1);
        tv_image2= (ImageView) findViewById(R.id.tv_image2);
    }

    //赋值
    public void setLineChar(List<TemperatureTableItem> data){
        yFloat.clear();
        aString.clear();

        yFloat1.clear();
        aString1.clear();

        ViseLog.d("绘制的折线图数据的长度为"+data.size()+"-----"+referenceValue);

        if (data != null) {
            if (data.size() != 0) {
                for (int i = 0; i < data.size(); i++) {

                    if(referenceValue!=null){
                        data.get(i).Judgereference(referenceValue);
                    }
                    if(data.get(i).getLogTime()!=null){
                        if (data.get(i).getMaxValue()!= 0) {
                            MAXValue = data.get(i).getMaxValue();//获取参考值最大值
                            data.get(i).getStatus();
                        }
                        if (data.get(i).getMixValue() != 0) {
                            MIXValue = data.get(i).getMixValue(); //获取参考值最小值
                        }
                        Status = data.get(i).getStatus();
                        String time = data.get(i).getLogTime();
                        aString.add(time);
                        yFloat.add(Float.parseFloat(data.get(i).getLogValue()));

                        ViseLog.d("++++++++++++++232323232"+data.get(i).paired);
                        if(data.get(i).paired!=null){
                            yFloat1.add(Float.parseFloat(data.get(i).paired));
                        }
                    }
                }
            }
            broken_line(Status); //折线处理
        }
    }


    //倒叙排列
    public void setFlashback(List<TemperatureTableItem> data,int[] index){

        ViseLog.d("出入量的值"+data.size());
        yFloat.clear();
        aString.clear();

        yFloat1.clear();
        aString1.clear();

        if (data != null) {
            if (data.size() != 0) {
                for (int i = data.size()-1; i > 0; i--) {

                    if(referenceValue!=null){
                        data.get(i).Judgereference(referenceValue);
                    }
                    if(data.get(i).getLogTime()!=null){
                        if (data.get(i).getMaxValue()!= 0) {
                            MAXValue = data.get(i).getMaxValue();//获取参考值最大值
                            data.get(i).getStatus();
                        }
                        if (data.get(i).getMixValue() != 0) {
                            MIXValue = data.get(i).getMixValue(); //获取参考值最小值
                        }
                        Status = data.get(i).getStatus();
                        String time=null;
                        if(index.length!=0){
                            time = data.get(i).getLogTime().substring(index[0],index[1]);
                        }else{
                            time = data.get(i).getLogTime();
                        }
                        aString.add(time);
                        yFloat.add(Float.parseFloat(data.get(i).getLogValue()));
                        if(data.get(i).paired!=null){
                            yFloat1.add(Float.parseFloat(data.get(i).paired));
                        }
                    }
                }
            }
            broken_line(Status); //折线处理
        }
    }


    public void broken_line(int status) {

        if (status == Maxstatus) {
            getAxisXLables();// 获取x轴的标注
            getAxisPoints();// 获取坐标点
            getAxisPointMax(MAXValue);  //最大值
            if (mPointValues.size() == 0) {
                fl_visibili.setVisibility(View.VISIBLE);
                ll_visibili.setVisibility(View.GONE);

            } else {
                fl_visibili.setVisibility(View.GONE);
                ll_visibili.setVisibility(View.VISIBLE);
                initLineChart();// 初始化
            }

        } else if (status == Mixstatus) {
            getAxisXLables();// 获取x轴的标注
            getAxisPoints();// 获取坐标点
            getAxisPointMix(MIXValue);      //最小值
            if (mPointValues.size() == 0) {
                fl_visibili.setVisibility(View.VISIBLE);
                ll_visibili.setVisibility(View.GONE);
            } else {
                initLineChart();// 初始化
                fl_visibili.setVisibility(View.GONE);
                ll_visibili.setVisibility(View.VISIBLE);
            }
        } else if (status == Allstatus) {
            getAxisXLables();// 获取x轴的标注
            getAxisPoints();// 获取坐标点
            getAxisPointMix(MAXValue);      //最小值
            getAxisPointMax(MIXValue);  //最大值
            if (mPointValues.size() == 0) {
                fl_visibili.setVisibility(View.VISIBLE);
                ll_visibili.setVisibility(View.GONE);
            } else {
                initLineChart();// 初始化
                fl_visibili.setVisibility(View.GONE);
                ll_visibili.setVisibility(View.VISIBLE);
            }
        } else if (status == Nostatus) {
            fl_visibili.setVisibility(View.VISIBLE);
            ll_visibili.setVisibility(View.GONE);
            initLineChart();
            getAxisXLables();// 获取x轴的标注
            getAxisPoints();// 获取坐标点
        }


//        Viewport v = new Viewport(line_chart.getMaximumViewport());
//        v.left = 0;
//        v.right = 7;
//        line_chart.setCurrentViewport(v);
    }


    /**
     * 初始化LineChart的一些设置
     */

    private void initLineChart() {

        ViseLog.d("+++++++++++++++++++++++++++++++++++"+ic_accuracy);
        Line line = new Line(mPointValues).setColor(Color.parseColor("#01B786")); // 折线的颜色
        Line line1 = new Line(mPointValues1).setColor(Color.parseColor("#00000000")); // 折线的颜色
        Line line2 = new Line(mPointValues2).setColor(Color.parseColor("#00000000"));
        Line line3 = new Line(mPointValues3).setColor(Color.parseColor("#FFC125"));
        List<Line> lines = new ArrayList<Line>();
        line.setShape(ValueShape.CIRCLE);// 折线图上每个数据点的形状 这里是圆形 （有三种
        line.setCubic(false);// 曲线是否平滑
        line.setStrokeWidth(3);//线条的粗细，默认是3
        line.setFilled(false);// 是否填充曲线的面积
        line.setHasLabels(true);// 曲线的数据坐标是否加上备注
        if(ic_accuracy!=null && ic_accuracy.length()>0 ){
           int num=Integer.parseInt(ic_accuracy);
            line.setFormatter(new SimpleLineChartValueFormatter(num));
        }

//        line.setHasLabelsOnlyForSelected(true);//点击数据坐标提示数据（设置了这个line.setHasLabels(true);就无效）
        line.setHasLines(true);// 是否用直线显示。如果为false 则没有曲线只有点显示
        line.setHasPoints(true);// 是否显示圆点 如果为false 则没有原点只有点显示
        line.setPointRadius(3); //设置点的信息
        line1.setShape(ValueShape.CIRCLE);// 折线图上每个数据点的形状 这里是圆形 （有三种
        line1.setStrokeWidth(3);//线条的粗细，默认是3
        line1.setCubic(false);
        line1.setFilled(false);
        line1.setHasLabels(false);
        line1.setHasLines(true);
        line1.setHasPoints(false);
        line2.setShape(ValueShape.CIRCLE);// 折线图上每个数据点的形状 这里是圆形 （有三种
        line2.setStrokeWidth(3);//线条的粗细，默认是3
        line2.setCubic(false);
        line2.setFilled(false);
        line2.setHasLabels(false);
        line2.setPointRadius(3); //设置点的信息
        line2.setHasLines(true);
        line2.setHasPoints(false);
        //第三条折线
        line3.setShape(ValueShape.CIRCLE);// 折线图上每个数据点的形状 这里是圆形 （有三种
        line3.setStrokeWidth(3);//线条的粗细，默认是3
        line3.setCubic(false);
        line3.setFilled(false);
        line3.setPointRadius(3); //设置点的信息
        line3.setHasLabels(true);// 曲线的数据坐标是否加上备注

        if(ic_accuracy!=null && ic_accuracy.length()>0 ){
            int num=Integer.parseInt(ic_accuracy);
            line3.setFormatter(new SimpleLineChartValueFormatter(num));
        }

        line3.setHasLines(true);
        line3.setHasPoints(true);


        lines.add(line);
        lines.add(line1);
        lines.add(line2);
        //第三条折线
        lines.add(line3);
        LineChartData data = new LineChartData();
        data.setLines(lines);


        data.setValueLabelBackgroundColor(R.color.common_bottom_bar_selected_bg);
        data.setValueLabelBackgroundEnabled(false);
        data.setValueLabelsTextColor(Color.parseColor("#4A8A00"));
        // 坐标轴
        Axis axisX = new Axis(); // X轴
        axisX.setHasTiltedLabels(false); // X轴下面坐标轴字体是斜的显示还是直的，true是斜的显示
        // axisX.setTextColor(Color.WHITE); //设置字体颜色
        axisX.setTextColor(Color.parseColor("#000000"));// 灰色

        // axisX.setName("未来几天的天气"); //表格名称
        axisX.setTextSize(11);// 设置字体大小
        axisX.setMaxLabelChars(7); // 最多几个X轴坐标，意思就是你的缩放让X轴上数据的个数7<=x<=mAxisValues.length
        axisX.setValues(mAxisXValues); // 填充X轴的坐标名称
        axisX.setValues(mAxisXValues1);
        data.setAxisXBottom(axisX); // x 轴在底部
        // data.setAxisXTop(axisX); //x 轴在顶部
        if(lc_name_y!=null){
            axisX.setName(lc_name_y);
        }
        axisX.setHasLines(true); // x 轴分割线
        Axis axisY = new Axis(); // Y轴
        axisY.setTextSize(11);// 设置字体大小
        axisY.setTextColor(Color.parseColor("#000000"));
        if(lc_name_x!=null){
            axisY.setName(lc_name_x);
        }
        data.setAxisYLeft(axisY); // Y轴设置在左边
        // data.setAxisYRight(axisY); //y轴设置在右边
        // 设置行为属性，支持缩放、滑动以及平移
        line_chart.setInteractive(true);
        line_chart.setZoomType(ZoomType.HORIZONTAL); // 缩放类型，水平
        line_chart.setMaxZoom((float) 3);// 缩放比例
        line_chart.setLineChartData(data);
        line_chart.setVisibility(View.VISIBLE);

        Viewport v = new Viewport(line_chart.getMaximumViewport());
        v.left = 0;
        v.right = mAxisXValues.size();
        line_chart.setCurrentViewport(v);
    }


    public void OnOnTouchListener(LineChartView.OnTouchListener listener) {
        line_chart.setOnTouchListener(listener);
    }

    /**
     * X 轴的显示
     */
    private void getAxisXLables() {
        mAxisXValues.clear();
        //第三条折线
        mAxisXValues1.clear();
        for (int i = 0; i < aString.size(); i++) {
            mAxisXValues.add(new AxisValue(i).setLabel(aString.get(i)));
        }
        //第三条折线
        mAxisXValues1.clear();
        for (int i = 0; i < aString.size(); i++) {
            mAxisXValues1.add(new AxisValue(i).setLabel(aString.get(i)));
        }
    }

    /**
     * 图表的每个点的显示
     */
    private void getAxisPoints() {
        mPointValues.clear();
        //第三条折线
        mPointValues3.clear();
        for (int i = 0; i < yFloat.size(); i++) {
//            if (yFloat.get(i) != 0) {
                mPointValues.add(new PointValue(i,yFloat.get(i)));
//            }
        }

        //第三条折线
        for (int i = 0; i < yFloat1.size(); i++) {
//            if (yFloat1.get(i) != 0) {
                mPointValues3.add(new PointValue(i,yFloat1.get(i)));
                ViseLog.d("第二条线条"+mPointValues3.size()+"++"+yFloat1.size());
//            }
        }
    }

    /**
     * 区间范围
     */

    List<Float> mixValue = new ArrayList<>();
    List<Float> maxValue = new ArrayList<>();

    private void getAxisPointMix(Float mixvalue) {   //最小值
        mixValue.clear();
        //第三条折线
        mPointValues1.clear();

        //添加最小值
        for (int i = 0; i < 7; i++) {
            mixValue.add(Float.valueOf(mixvalue));
        }

        Float[] score1 = new Float[mixValue.size()];
        for (int i = 0; i < mixValue.size(); i++) {
            score1[i] = mixValue.get(i);
        }
        //第三条折线
        for (int i = 0; i < score1.length; i++) {
            mPointValues1.add(new PointValue(i, score1[i]));
        }
    }

    private void getAxisPointMax(Float maxvalue) {   //最大值

        maxValue.clear();
        //第三条折线
        mPointValues2.clear();

        //添加最大值
        for (int i = 0; i < 7; i++) {
            maxValue.add(Float.valueOf(maxvalue));
        }
        Float[] score2 = new Float[maxValue.size()];
        for (int i = 0; i < maxValue.size(); i++) {
            score2[i] = maxValue.get(i);
        }
        //第三条折线
        for (int i = 0; i < score2.length; i++) {
            mPointValues2.add(new PointValue(i, score2[i]));
        }
    }

}
